package com.gta.edu.sdk.util;

import java.io.Serializable;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

public class RedisClusterUtil {
	private RedisTemplate<String,Serializable> redisTemplate;
	private StringRedisTemplate stringRedisTemplate;
	
	private static RedisClusterUtil util = new RedisClusterUtil();
	
	public static RedisClusterUtil getInstance() {
		if (util == null) {
			util = new RedisClusterUtil();
		}
		return util;
	}
	
	private RedisClusterUtil() {
		this.redisTemplate = SpringContextHolder.getBean("redisTemplate");
		this.stringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate");
	}
	
	/**
	 * @description 以字符串的形式设置键值
	 * @author 冯亚
	 * @date 2019年8月22日 下午4:31:39
	 * @param key
	 * @param value
	 * void
	 */
	public final void setString(String key, String value) {
		this.stringRedisTemplate.opsForValue().set(key, value);
	}
	
	/**
	 * @description 
	 * @author 冯亚
	 * @date 2019年8月22日 下午4:31:56
	 * @param key
	 * @param value
	 * @param timeout
	 * void
	 */
	public final void setString(String key, String value,long timeout) {
		this.stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
	}
	
	public final boolean setIfAbsent(String key, String value,long timeout) {
		return this.stringRedisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.SECONDS);
	}
	
	/***
	 * @param key
	 * @param timeout
	 */
	public final void stringExpire(String key, long timeout) {
		this.stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
	}
	
	/**
	 * @description 
	 * @author 冯亚
	 * @date 2019年8月22日 下午4:32:09
	 * @param key
	 * @return
	 * String
	 */
	public final String getString(String key) {
		return this.stringRedisTemplate.opsForValue().get(key);
	}
	
	/**
	 * @description 向redis中存储键值对
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:18:35
	 * @param key
	 * @param value
	 * void
	 */
	public final void set(String key, String value) {
		this.redisTemplate.opsForValue().set(key, value);
	}

	/**
	 * @description 向redis中存储键值对，并且设置有效期
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:19:19
	 * @param key
	 * @param value
	 * @param second
	 * void
	 */
	public final void set(String key, Serializable value, int second) {
		this.redisTemplate.opsForValue().set(key, value, second, TimeUnit.SECONDS);
	}
	
	/**
	 * @description 根据键获取值
	 * @author 冯亚
	 * @date 2019年8月15日 下午5:45:26
	 * @param key
	 * @return
	 * Serializable
	 */
	public final Serializable get(String key) {
		return this.redisTemplate.opsForValue().get(key);
	}
	
	/**
	 * @description 向redis中存储map数据
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:19:47
	 * @param key
	 * @param value
	 * void
	 */
	public final void hmset(String key, String hashKey,String hashValue) {
		this.redisTemplate.opsForHash().put(key, hashKey, hashValue);
	}
	
	/**
	 * @description 
	 * @author 冯亚
	 * @date 2019年8月22日 下午4:42:34
	 * @param key
	 * @param hashKey
	 * @param hashValue
	 * void
	 */
	public final void hmsetString(String key, String hashKey,String hashValue) {
		this.stringRedisTemplate.opsForHash().put(key, hashKey, hashValue);
	}
	
	/**
	 * @description 根据键获取map值为fields的值
	 * @author 冯亚
	 * @date 2019年8月14日 上午8:48:43
	 * @param key
	 * @param fields
	 * void
	 */
	public final Object hmget(String key, String hashKey) {
		return this.redisTemplate.opsForHash().get(key, hashKey);
	}
	
	/**
	 * @description 
	 * @author 冯亚
	 * @date 2019年8月22日 下午4:42:49
	 * @param key
	 * @param hashKey
	 * @return
	 * Object
	 */
	public final Object hmgetString(String key, String hashKey) {
		return this.stringRedisTemplate.opsForHash().get(key, hashKey);
	}

	/**
	 * @description 设置键的有效期
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:20:55
	 * @param key
	 * @param seconds
	 * void
	 */
	public final void expire(String key, int seconds) {
		this.redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
	}

	/**
	 * @description 从redis中删除键为key的数据
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:21:28
	 * @param key
	 * void
	 */
	public final void del(String key) {
		this.redisTemplate.delete(key);
	}

	/**
	 * @description 从redis中删除多个键的数据
	 * @author 冯亚
	 * @date 2019年8月6日 上午8:21:57
	 * @param keys
	 * void
	 */
	public final void del(List<String> keys) {
		this.redisTemplate.delete(keys);
	}
	
	/**
	 * @description 
	 * @author fengya
	 * @date 2020年8月31日 下午3:40:52
	 * @param key
	 * @param list
	 * void
	 */
	public final void addList(String key,List<Serializable> list) {
		this.redisTemplate.opsForList().rightPushAll(key, list);
	}
	
	/**
	 * @description 从集合中右侧添加一个元素
	 * @author fengya
	 * @date 2020年8月31日 下午4:09:57
	 * @param key
	 * @param value
	 * void
	 */
	public final void addList(String key,Serializable value) {
		this.redisTemplate.opsForList().rightPush(key, value);
	}
	
	/**
	 * @description 从健为key的list集合中获取从左向右的length条记录数据
	 * @author fengya
	 * @date 2020年8月31日 下午3:40:52
	 * @param key
	 * @param list
	 * void
	 */
	public final List<Serializable> list(String key,long length) {
		return this.redisTemplate.opsForList().range(key, 0, length);
	}
	
	/**
	 * @description 删除健为key的list集合中从左到右length条记录数据
	 * @author fengya
	 * @date 2020年8月31日 下午4:06:53
	 * @param key
	 * @param length
	 * void
	 */
	public final void deleteList(String key,long length) {
		long size = this.listSize(key);
		this.redisTemplate.opsForList().trim(key, length, size);
	}
	
	/**
	 * @description 获取健为key的list集合数据的长度
	 * @author fengya
	 * @date 2020年8月31日 下午4:08:07
	 * @param key
	 * @return
	 * long
	 */
	public final long listSize(String key) {
		return this.redisTemplate.opsForList().size(key);
	}
}
